/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia;

import Interfaz.InterfazControl;
import Motor.ClaseUtilitaria;
import Motor.Cliente;
import Motor.Factura;
import Motor.Producto;
import Motor.TarjetaDeAfiliado;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;

//import java.text.ParseException;
//import java.util.ArrayList;
//import java.util.Iterator;
//import java.util.List;
import org.jdom.Document;
import org.jdom.JDOMException;
import org.jdom.Namespace;
import org.jdom.output.XMLOutputter;

//import proyecto.*;
/**
 *
 * @author yindri
 */
public class DAOClienteXML {

	/** variable que contiene la raiz del documento Xml*/
	private Element root;
	/** variable que contiene la localizacion del archivo xml*/
	private String fileLocation = "src//archivo//Clientes.xml";
	private InterfazControl laInterfazControl;

//    /**
//     * constructor por defecto que inicia los valores para trabajar con el documento
//     * xml
//     */
	public DAOClienteXML(InterfazControl laInterfazControl) //throws IOException
	{
		this.laInterfazControl = laInterfazControl;
		try {
			SAXBuilder builder = new SAXBuilder(false);
			Document doc = null;
			doc = builder.build(fileLocation);
			root = doc.getRootElement();
		} catch (JDOMException ex) {
			System.out.println("No se pudo iniciar la operacion por: " + ex.getMessage());
		} catch (IOException ex) {
			System.out.println("No se pudo iniciar la operacion por: " + ex.getMessage());
		}
	}

	/*Aqui lleno todo el contexto que le voy a insertar al archivo, es decir
	el nodo principal que es Cliente con los atributos que le corresponden,
	los cuales seria cedula,nombre y apellido,etc*/
	public Element ClientetoXmlElement(Cliente cliente) throws IOException {


		Element raizCliente = new Element("cliente");

		Element nombre = new Element("nombre");
		nombre.setText(cliente.getNombre());
		Element apellido = new Element("apellido");
		apellido.setText(cliente.getApellido());
		Element cedula = new Element("cedula");
		cedula.setText(cliente.getCedula());
		Element direccion = new Element("direccion");
		direccion.setText(cliente.getDireccion());
		Element telefono = new Element("telefono");
		telefono.setText(cliente.getTelefono());
		Element email = new Element("email");
		email.setText(cliente.getEmail());
		Element login = new Element("login");
		login.setText(cliente.getLogin());
		Element password = new Element("password");
		password.setText(cliente.getPassword());
		Element fechaNacimiento = new Element("fechaNacimiento");
		try {
			fechaNacimiento.setText(ClaseUtilitaria.convertiDateString(cliente.getFechaDeNacimiento()));
		} catch (ParseException ex) {
		}

		Element clienteAsociado = new Element("clienteAsociado");
		clienteAsociado.setText(Boolean.toString(cliente.isClienteAsociado()));
		Element sexo = new Element("sexo");
		sexo.setText(Character.toString(cliente.getSexo()));
		Element fechaIngreso = new Element("fechaIngreso");
		try {
			fechaIngreso.setText(ClaseUtilitaria.convertiDateString(cliente.getFechaIngreso()));
		} catch (ParseException ex1) {
		}

		Element esJuridico = new Element("esJuridico");
		esJuridico.setText(Boolean.toString(cliente.isEsJuridico()));


		raizCliente.addContent(nombre);
		raizCliente.addContent(apellido);
		raizCliente.addContent(cedula);
		raizCliente.addContent(direccion);
		raizCliente.addContent(telefono);
		raizCliente.addContent(email);
		raizCliente.addContent(login);
		raizCliente.addContent(password);
		raizCliente.addContent(fechaNacimiento);
		raizCliente.addContent(clienteAsociado);
		raizCliente.addContent(sexo);
		raizCliente.addContent(fechaIngreso);
		raizCliente.addContent(esJuridico);

		if (cliente.isClienteAsociado()) {
			System.out.print(cliente.isClienteAsociado() + "  <...aca true o false");
			DAOTarjetaDeAfiliadoXML tarjertaDeAfiliado = new DAOTarjetaDeAfiliadoXML();
			raizCliente.addContent(tarjertaDeAfiliado.TarjetaDeAfiliadotoXmlElement(cliente.getLaTarjeta()));
		}

		if (cliente.getListaFacturas() != null) {
			DAOFacturaXML factur = new DAOFacturaXML();

			List<Factura> facturas = cliente.getListaFacturas();
			for (Factura factura : facturas) {
				raizCliente.addContent(factur.FacturatoXmlElement(factura));
			}
		}



//
//        if (paciente.getPlanPaciente() != null){
//            DAOPlanXML tempPlan = new DAOPlanXML();
//            raizPaciente.addContent(tempPlan.PlantoXmlElement(paciente.getPlanPaciente()));
//        }
//
//        if (paciente.getCitaMedica() != null){
//            DAOCitaXML tempCita = new DAOCitaXML();
//            Iterator i = (paciente.getCitaMedica()).iterator();
//            while (i.hasNext()){
//                raizPaciente.addContent(tempCita.CitatoXmlElement((Cita) i.next()));
//            }
//        }
///
		return raizCliente;
	}
//
//   /*Método que retorna un Cliente. A este metodo se le manda un Element y con
//    sus datos se hará los pasos requeridos para crear el Cliente*/

	private Cliente ClienteToObject(Element element) throws ParseException {
		Cliente nuevoCliente = new Cliente();
		//DAOTarjetaDeAfiliadoXML tarj = new DAOTarjetaDeAfiliadoXML();



//		String nombre, String apellido, String cedula, String direccion, String telefono,
//	String email, String login, String password, Date fechaDeNacimiento, boolean clienteAsociado,
//	char sexo,Date fechaIngreso, boolean esJuridico, TarjetaDeAfiliado laTarjeta, ArrayList <Factura>
//	listaFacturas
		nuevoCliente.setNombre(element.getChildText("nombre"));
		nuevoCliente.setApellido(element.getChildText("apellido"));
		nuevoCliente.setCedula(element.getChildText("cedula"));
		nuevoCliente.setDireccion(element.getChildText("direccion"));
		nuevoCliente.setTelefono(element.getChildText("telefono"));
		nuevoCliente.setEmail(element.getChildText("email"));
		nuevoCliente.setLogin(element.getChildText("login"));
		nuevoCliente.setPassword(element.getChildText("password"));
		String fechaNacimiento = element.getChildText("fechaNacimiento");
		nuevoCliente.setFechaDeNacimiento(ClaseUtilitaria.convertirStringaDate(fechaNacimiento));
		nuevoCliente.setClienteAsociado(Boolean.parseBoolean(element.getChildText("clienteAsociado")));
		nuevoCliente.setSexo(element.getChildText("sexo").charAt(0));
		nuevoCliente.setFechaIngreso(ClaseUtilitaria.convertirStringaDate(element.getChildText("fechaIngreso")));
		nuevoCliente.setEsJuridico(Boolean.parseBoolean(element.getChildText("esJuridico")));
		List<Factura> facturas = new ArrayList<Factura>();


		List<Element> eFacturas = element.getChild("facturas").getChildren();

		for (Element elemento : eFacturas) {
			List<Producto> productos = new ArrayList<Producto>();
			List<Element> eProductos = elemento.getChild("productos").getChildren();
			for (Element element1 : eProductos) {
				productos.add(laInterfazControl.buscarProducto(Integer.parseInt(element1.getText())));
			}
			facturas.add(new Factura(
					Integer.parseInt(elemento.getChildText("idFactura")),
					Integer.parseInt(elemento.getChildText("idCajera")),
					Float.parseFloat(elemento.getChildText("monto")),
					Float.parseFloat(elemento.getChildText("iva")),
					productos));

		}
		nuevoCliente.setListaFacturas(facturas);


		//	nuevoCliente.setLaTarjeta(tarj.tarjetaDeAfiliadoToObject(element.getChild("tarjetaDeAfiliado")));


		//    clinica.setInventario(inv.InventarioToObject(element.getChild("inventario")));

		// COMO SE CONVIERTE LA LISTA DE FACTURA EN OBJETO ???  <<<<<<<<<<<<<<<----------------------------
// y  la  TARJETA AFILIADO

		return nuevoCliente;
	}

//    {
//        Paciente nuevoPaciente = new Paciente();
//	nuevoPaciente.setNombreCompleto(element.getChildText("nombre"));
//        nuevoPaciente.setCedula(Integer.parseInt(element.getChildText("cedula")));
//        String st = (element.getChildText("fechanacimiento"));
//        HoraFecha hf = new HoraFecha(st.split("/"));
//        nuevoPaciente.setFechaNacimiento(hf);
//        nuevoPaciente.setUsuario(element.getChildText("usuario"));
//        nuevoPaciente.setContrasena(element.getChildText("contrasena"));
//        nuevoPaciente.setResidencia(element.getChildText("residencia"));
//        nuevoPaciente.setTelefono(element.getChildText("telefono"));
//        nuevoPaciente.setCuentaActiva(Boolean.parseBoolean(element.getChildText("cuentaactiva")));
////
//        DAOCitaXML tempCita = new DAOCitaXML();
//
//        for (Object it : element.getChildren("cita")) {
//            Element xmlElem = (Element) it;
//            try {
//                nuevoPaciente.agregarCitaMedica(tempCita.CitaToObject(xmlElem));
//            } catch (ParseException ex) {
//                System.out.println(ex.getMessage());
//            }
//        }
//
//        DAOEntradaSalidaXML entSal = new DAOEntradaSalidaXML();
//
//        for (Object it : element.getChildren("entradasalida")) {
//            Element xmlElem = (Element) it;
//            try {
//                nuevoPaciente.nuevoRegistroES(entSal.EntradaSalidaToObject(xmlElem));
//            } catch (ParseException ex) {
//                System.out.println(ex.getMessage());
//            }
//        }
//        if (element.getChild("historia") != null){
//			if(element.getChild("historia").getText().compareTo("")!=0)
//			{
//				DAOHistoriaXML historia = new DAOHistoriaXML();
//				nuevoPaciente.setHistorialPaciente(historia.HistoriaToObject(element.getChild("historia")));
//
//			}
//	    }
//
//        if (element.getChild("plan") != null){
//            DAOPlanXML plan = new DAOPlanXML();
//            nuevoPaciente.setPlanPaciente(plan.PlanToObject(element.getChild("plan")));
//        }
//
//        return nuevoPaciente;
//    }
//
   /* Operacion para guardar en el documento Xml los cambios efectuados
	 * @return true si se cumplio la operacion con exito, false en caso contrario*/
	private boolean updateDocument() {
		try {
			XMLOutputter out = new XMLOutputter(org.jdom.output.Format.getPrettyFormat());
			FileOutputStream file = new FileOutputStream(fileLocation);
			out.output(root, file);
			file.flush();
			file.close();
			return true;
		} catch (Exception e) {
			System.out.println("error: " + e.getMessage());
			return false;
		}
	}

	/* Operacion que busca un elemento que cumpla con una condicion en el id del xml
	 * @param raiz = raiz del documento xml
	 * @param dato = elemento a buscar.
	 * @return retorna el elemento si existe con la condicion, en caso contrario retorna null */
	public static Element buscar(List raiz, String dato) {
		Iterator i = raiz.iterator();
		while (i.hasNext()) {
			Element e = (Element) i.next();
			if (dato.equals(e.getChild("cedula").getText())) {
				return e;
			}
		}
		return null;
	}

//   //TODO Por adaptar
//   // @return valor boleano con la condicion de exito
	public boolean agregarCliente(List<Cliente> clientes) throws IOException {
		boolean resultado = false;
		root.removeContent();
		for (Cliente cliente : clientes) {
			root.addContent(ClientetoXmlElement(cliente));
		}

		resultado = updateDocument();
		return resultado;
	}

	/* @param cedula numero de cedula del Cliente a buscar
	 * @return objeto Cliente con sus datos segun busqueda*/
	public Cliente buscarCliente(Integer cedula) {
		Element aux = new Element("cliente");
		List Clientes = this.root.getChildren("cliente"); //aca llamo a mis CLIENTES XML  q esta en archivo?
		while (aux != null) {
			aux = DAOClienteXML.buscar(Clientes, Integer.toString(cedula));
			if (aux != null) {
				try {
					System.out.println("CLIENTE SI EXISTE");
					return ClienteToObject(aux);
				} catch (ParseException ex) {
					System.out.println(ex.getMessage());
				}
			}
		}
		return null;
	}

//    /* @param Estudiante objeto Estudiante a actualizar
//     * @return valor boleano con la condicion de exito */
//    public boolean actualizarPaciente(Paciente nPaciente) {
//        boolean resultado = false;
//        Element aux = new Element("paciente");
//        List Pacientes = this.root.getChildren("paciente");
//        while (aux != null) {
//            aux = DAOPacienteXML.buscar(Pacientes, Integer.toString(nPaciente.getCedula()));
//            if (aux != null) {
//                Pacientes.remove(aux);
//                resultado = updateDocument();
//            }
//        }
//        agregarPaciente(nPaciente);
//        return resultado;
//    }
//
//    //TODO Por adaptar
//
    /* @param cedula cedula del Estudiante a borrar
	 * @return valor boleano con la condicion de exito  */
	public boolean borrarCliente(Integer cedula) {
		boolean resultado = false;
		Element aux = new Element("cliente");
		List Clientes = this.root.getChildren("cliente");
		while (aux != null) {
			aux = DAOClienteXML.buscar(Clientes, Integer.toString(cedula));
			if (aux != null) {
				Clientes.remove(aux);
				resultado = updateDocument();
			}
		}
		return resultado;
	}

//    //TODO Por adaptar
//
    /* Para obtener todos los Clientes
	 * @return ArrayList con todos los objetos Cliente  */
	public ArrayList<Cliente> todosLosClientes() {
		ArrayList<Cliente> resultado = new ArrayList<Cliente>();
		for (Object it : root.getChildren()) {
			Element xmlElem = (Element) it;
			try {
				resultado.add(ClienteToObject(xmlElem));
			} catch (ParseException ex) {
				System.out.println(ex.getMessage());
			}
		}
		return resultado;
	}

	public boolean borrarCliente() {
		boolean resultado2 = false;
		ArrayList<Cliente> listaborrar = new ArrayList<Cliente>();
		listaborrar = todosLosClientes();

		System.out.print("acaa en borrardao");

		Element aux = new Element("cliente");
		Element aux2 = new Element("root");
		List Clientes = this.root.getChildren("cliente");

		for (Cliente cli : listaborrar) {
			listaborrar.remove(cli);
		}

//        while (aux != null) {}
//            aux = DAOClienteXML.buscar(Clientes, Integer.toString(cedula));
//            if (aux != null) {
//
//		while(aux != aux2) {
//
//				Clientes.remove(aux);
//
//				resultado = updateDocument();
//			    //break;
//				}
//



		return resultado2;
	}
}
